﻿/**
 *
 * @file   QwtCustomPlot.h
 * @brief  qwt绘图类
 * @author XingXuanCi (xingxuanci@diso.cn)
 * @date   2024-11-12
 *
 */
#ifndef QWTCUSTOMPLOT_H
#define QWTCUSTOMPLOT_H

#ifndef QWT_DLL
#define QWT_DLL
#endif

#include <qwt_plot.h>
#include <qwt_symbol.h>

class QwtPlotGrid;
class QwtPlotCanvas;
class QwtPlotCurve;
class QwtLegend;
#include "GUIPhyscisDialogAPI.h"

namespace GUI
{
    /**
     * @brief  qwt绘图类
     * @author XingXuanCi (xingxuanci@diso.cn)
     * @date   2024-11-12
     */
    class GUIPhyscisDialogAPI QwtCustomPlot : public QwtPlot
    {
    public:
        /**
         * @brief   构造函数
         * @param   parent 父窗口指针
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        QwtCustomPlot(QWidget* parent = nullptr);
        /**
         * @brief   析构函数
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        ~QwtCustomPlot();
        /**
         * @brief   设置X轴和Y轴的名称
         * @param   xName[i] X轴名称
         * @param   yName[i] Y轴名称
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void setAxisName(QString xName, QString yName);
        void setAxisXName(QString xName);
        void setAxisYName(QString yName);
        /**
         * @brief   设置绘图的标题
         * @param[i]   plotName 标题
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void setTitle(QString plotName);
        void addCurve(QVector<QPointF> data, QColor color,QString name);
        void addCurve(QVector<float> xData, QVector<float> yData, QColor color, QString name = "Curve");
        /**
         * @brief      添加曲线
         * @param[i]   xData X轴数据点的向量
         * @param[i]   yData Y轴数据点的向量
         * @param[i]   name   曲线的名称，默认为"Curve"
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void setCurveData(QVector<float> xData, QVector<float> yData, QString name="");
        /**
         * @brief   清空所有曲线
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void clearCurves();
        QHash<QString, float> getColValues() const { return _colValues; }
        void setColValues(QHash<QString, float> val) { _colValues = val; }
        /**
         * @brief 图例初始化
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27
         */
        void initLegend();

        /**
         * @brief   更新图例选中状态
         * @author  TanDongYang (tandongyang@diso.cn)
         * @date    2024-11-28
         */
        void updateAllLegendChecked();


    private:
        /**
         * @brief   初始化
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void init();
        /**
         * @brief   初始化网格设置
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void initGrid();
        /**
         * @brief   初始化画布设置
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        void initCanvas();
        /**
         * @brief 图例显示和隐藏操作
         * @param[i]   index
         * @param[i]   isCheckked
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27 
         */
        void setLegendChecked(int index, bool isCheckked);



    private slots:
        /**
         * @brief 图例显示和隐藏操作
         * @param[i]   itemInfo 索引选项
         * @param[i]   checked 是否显示
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27
         */
        void slot_legendClicked(const QVariant & itemInfo, bool checked);

    private:
        /**
         * @brief   曲线数据
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-26
         */
        QHash<QString,float> _colValues;
        /**
         * @brief   网格对象
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        QwtPlotGrid* _grid{};
        /**
         * @brief   画布对象
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        QwtPlotCanvas* _canvas{};
        /**
         * @brief   曲线列表，存储所有添加的曲线
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        QList<QwtPlotCurve*> _curvePlotList;
        /**
         * @brief   曲线
         * @author  XingXuanCi (xingxuanci@diso.cn)
         * @date    2024-11-12
         */
        QwtPlotCurve* _curve{};
        /**
         * @brief 图例
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-27 
         */
        QwtLegend* _legend{};
        /**
         * @brief 点大小
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-26 
         */
        int _dotSize = 5;
        /**
         * @brief 线宽
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-26 
         */
        int _curvePenWidth = 2;
    };
}
#endif // QWTCUSTOMPLOT_H
